package br.com.gaspar.batepapo.bo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.ejb.EJB;
import javax.ejb.Local;
import javax.ejb.Singleton;

import br.com.gaspar.batepapo.bo.iface.IBatePapoBO;
import br.com.gaspar.batepapo.dao.iface.IProjetoDAO;
import br.com.gaspar.batepapo.modelo.BatePapo;
import br.com.gaspar.batepapo.modelo.Usuario;
import br.com.gaspar.framework.modelo.BaseBO;
import br.com.gaspar.framework.persistencia.IBaseDAO;

@SuppressWarnings("rawtypes")
@Singleton
@Local(IBatePapoBO.class)
public class BatePapoBO extends BaseBO implements IBatePapoBO {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 9037085151626072330L;
	
	private List<Usuario> filaEsperaUsuarios = Collections.synchronizedList(new ArrayList<Usuario>());
	
	private List<Usuario> atendentes = Collections.synchronizedList(new ArrayList<Usuario>());
	
	private Map<String, BatePapo> salas = Collections.synchronizedMap(new HashMap<String, BatePapo>());
	
	@EJB
	private IProjetoDAO dao;
	
	@Override
	public IBaseDAO getDAOPadrao() {
		return this.dao;
	}

	@Override
	public List<Usuario> getFilaEsperaUsuarios() {
		return filaEsperaUsuarios;
	}

	public void setFilaEsperaUsuarios(List<Usuario> filaEsperaUsuarios) {
		this.filaEsperaUsuarios = filaEsperaUsuarios;
	}

	@Override
	public List<Usuario> getAtendentes() {
		return atendentes;
	}

	public void setAtendentes(List<Usuario> atendentes) {
		this.atendentes = atendentes;
	}

	@Override
	public Map<String, BatePapo> getSalas() {
		return salas;
	}

	public void setSalas(Map<String, BatePapo> salas) {
		this.salas = salas;
	}
	
	@Override
	public void registrarUsuario(Usuario usuario){
		if(!getFilaEsperaUsuarios().contains(usuario)){
			getFilaEsperaUsuarios().add(usuario);
		}
	}
	
	@Override
	public void removerUsuario(Usuario usuario){
		getFilaEsperaUsuarios().remove(usuario);
	}
	
	@Override
	public void registrarAtendente(Usuario atendente){
		if(!getAtendentes().contains(atendente)){
			getAtendentes().add(atendente);
		}
	}
	
	@Override
	public void removerAtendente(Usuario atendente){
		getAtendentes().remove(atendente);
	}

	@Override
	public Usuario proximoUsuario(){
		return getFilaEsperaUsuarios().remove(0);
	}
	
	@Override
	public Boolean existeChat(String id){
		return getSalas().containsKey(id);
	}
	
	@Override
	public BatePapo getSala(String id){
		return getSalas().get(id);
	}
	
	@Override
	public void criarSala(String id){
		getSalas().put(id, new BatePapo());
	}
	
	@Override
	public Integer getPosicaoUsuario(Usuario usuario){
		return getFilaEsperaUsuarios().indexOf(usuario);
	}
	
	@Override
	public void fecharSala(String id){
		getSalas().remove(id);
	}
	
}
